//
// Created by PC on 2023/6/16.
/*
https://www.luogu.com.cn/record/113368798
GESP 2023.6 三级真题 编程第2题
T2密码合规检测
时间限制:1000MS内存限制:256MB分数:100
---- 描述
 网站注册需要有用户名和密码，编写程序以检查用户输入密码的有效性。
 合规的密码应满足以下要求:
 1.只能由a-z之间26个小写字母、A-Z之间26 个大写字母、0-9之间10个数字以及"!@#$"4个特殊字符构成。
 2.密码最短长度:6个字符，密码最大长度:12个字符
 3.大写字母、小写字母和数字必须至少有其中两种，以及至少有四个特殊字符中的一个。
----输入描述
 输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段，作为多组被检测密码。
----输出描述
 输出若干行，每行输出一组合规的密码。输出顺序以输入先后为序，即先输入则先输出
用例输入1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&YUhg@!
 用例输出 1
seHJ12!@
sjdkffH$123
 * */
// 使用string内置函数
// 通过测试


#include <iostream>
#include <string>
#include <vector>

using namespace std;

/// 按照字符c, 分割字符串存入向量数组中
/// \param str
/// \param c
/// \return
vector<string> split(string &str, char c)
{
    //  先将分隔符加到最后, 方便分割最后一个串
    str += c;
    vector<string> splited;
    int begin = 0, end = 0, count = 0;
    for (char a:str)
    {
        if (a == c)
        {
            // 对于连续分隔符的(如",,,") 不将空串存到数组中
            if (begin != end)
                splited.push_back(str.substr(begin, count));
            begin = (end + 1);
            count = 0;
        } else
            count++;
        end++;
    }
    return splited;
}

int hasSmall(string &str)
{
    for (char a:str)
    {
        if (a >= 'a' and a <= 'z')
            return 1;
    }
    return 0;
}

int hasBig(string &str)
{
    for (char a:str)
    {
        if (a >= 'A' and a <= 'Z')
            return 1;
    }
    return 0;
}

int hasDigital(string &str)
{
    for (char a:str)
    {
        if (a >= '0' and a <= '9')
            return 1;
    }
    return 0;
}

bool hasOthers(string &str)
{
    for(char a:str)
    {
        bool small = (a >= 'a' and a <= 'z');
        bool big = (a >= 'A' and a <= 'Z');
        bool digital = (a >= '0' and a <= '9') ;
        bool special =(a == '!' || a == '@' || a == '#' || a == '$');
        if (!small && !big && !digital && !special)
            return true;
    }
    return false;
}

bool hasSpecial(string &str)
{
    for (char a:str)
    {
        if (a == '!' || a == '@' || a == '#' || a == '$')
            return true;
    }
    return false;
}


int main()
{
    string all = "abc!123(),seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&YUhg@!,123abc,abc123()";
//    cin >> all;
    vector<string> a = split(all, ',');
    for (string one:a)
    {
        int length = one.size();
        if (length < 6 or length > 12)
            continue;
        if (hasOthers(one))
            continue;
        if (hasBig(one)+hasSmall(one)+hasDigital(one)<2)
            continue;
        if (!hasSpecial(one))
            continue;
        printf("%s\n", one.c_str());
    }
    return 0;
}